package cn.bonoon.kernel.filters;

import cn.bonoon.kernel.VisibleScope;
import cn.bonoon.kernel.descriptors.EntityDescriptor;
import cn.bonoon.kernel.events.ReadEvent;
import cn.bonoon.kernel.support.searcher.StandardFinder;
import cn.bonoon.kernel.web.annotations.FilterParameter;

/**
 * <pre>
 * 标准的过滤器，
 * 只过滤当前登录用户是否是超级管理员，如果是则不限制owner的值
 * 标准过滤器是指：根据当前登录用户的身份、当前被数据实体的类型（范围实体）和该功能定义的操作范围三者来决定如何过滤数据：
 * 1.超级管理员：1）如果没有指定范围或全局范围，则可以操作所有数据、2）如果限制了域范围，则只能操作超级管理域的数据、3）如果限制了私有范围，则只能操作自己创建的数据
 * 2.管理员：1）如果指定为全局范围，则可以操作所有数据、2）如果没有指定范围或指定了域范围，则只能操作域内数据、3）如果限制了私有范围、则只能操作自己创建的数据
 * 3.用户：1）如果指定为全局范围，则可以操作所有数据、2）如果限制了域范围，则只能操作域内数据、3）如果没有指定范围或限制了私有范围、则只能操作自己创建的数据
 * 
 * 默认的标准过滤器可以使用{@link FilterParameter}来指定参数
 * </pre>
 * @author jackson
 *
 */
public class StandardAutoLoadFilter implements AutoLoadFilter{

	public StandardAutoLoadFilter(EntityDescriptor edes){
		scopable = edes.is(EntityDescriptor.SCOPABLE);
	}
	@Override
	public void filter(StandardFinder finder, ReadEvent event) {
		if(scopable){
//			if(null != limitProperty){
//				if(!(event.isSuper() && excludeSuper)){
//					finder.and(limitProperty, event.getOwnerId());
//				}
//			}else{
				VisibleScope scope = event.getScope();
				if(scope == VisibleScope.DOMAIN){
					finder.and("x.ownerId=?", event.toOwnerId());
				}else if(scope == VisibleScope.EXCLUSIVE || !(event.isSuper() || scope == VisibleScope.GLOBAL)){
					finder.and("x.ownerId=? and x.creatorId=?", event.toOwnerId(), event.getId());
				}
//			}
		}
	}
	
//	private String limitProperty;
//	private boolean excludeSuper = true;
	private final boolean scopable;
	
//	@Override
//	public void init(AnnotatedElement ele, EntityDescriptor edes) {
//		scopable = edes.is(EntityDescriptor.SCOPABLE);
//		
////		FilterParameter fp = ele.getAnnotation(FilterParameter.class);
////		if(null != fp){
////			if(StringHelper.isNotEmpty(fp.value())){
////				limitProperty = fp.value();
////				if(limitProperty.indexOf('.') == -1){
////					limitProperty = "x." + limitProperty;
////				}
////			}
////			excludeSuper = fp.excludeSuper();
////		}
//	}

}
